# 导入tkinter所有组件
from tkinter import *

def 创建框架(主窗口):
    """创建一个Frame框架，设置默认布局属性"""
    框架 = Frame(主窗口)
    框架.pack(side=TOP, expand=YES, fill=BOTH)  # 顶部对齐，允许扩展，填充整个空间
    return 框架

def 创建按钮(父框架, 按钮文本, 点击命令):
    """创建一个Button按钮，设置默认样式属性"""
    按钮 = Button(父框架, text=按钮文本, command=点击命令, width=6)  # 创建固定宽度的按钮
    按钮.pack(side=LEFT, expand=YES, fill=BOTH, padx=2, pady=2)  # 左对齐，允许扩展，填充空间，设置内边距
    return 按钮

def 计算结果(文本数据):
    """计算表达式的结果，支持千位分隔符的处理"""
    try:
        if (分隔符标志.get() == 0):  # 如果不使用千位分隔符
            return eval(删除分隔符(文本数据))  # 直接计算结果
        else:  # 如果使用千位分隔符
            return 添加分隔符(str(eval(删除分隔符(文本数据))))  # 计算结果后添加千位分隔符
    except (SyntaxError, ZeroDivisionError, NameError):
        return 'Error'  # 处理各种计算错误

def 退格(文本数据):
    """删除最后一个字符"""
    return 文本数据[:-1] if len(文本数据) > 0 else 文本数据

def 添加分隔符(文本数据):
    """为数字添加千位分隔符"""
    小数点位置 = 文本数据.find('.')
    # 处理不同情况：有小数点、无小数点、小数点在开头
    if 小数点位置 > 0:
        整数部分 = 文本数据[:小数点位置]
        小数部分 = 文本数据[小数点位置:]
    elif 小数点位置 < 0:
        整数部分 = 文本数据
        小数部分 = ''
    else:
        整数部分 = ''
        小数部分 = 文本数据

    # 将整数部分转换为字符列表
    数字列表 = [字符 for 字符 in 整数部分]
    长度 = len(数字列表)
    索引 = 3
    
    # 每三位插入一个逗号
    while 长度 - 索引 > 0:
        数字列表.insert(长度 - 索引, ',')
        索引 += 3
    
    # 合并整数部分和小数部分
    数字列表.extend(小数部分)
    return ''.join(数字列表)

def 删除分隔符(文本数据):
    """删除所有千位分隔符"""
    return 文本数据.replace(',', '')

# 创建主窗口
主窗口 = Tk()
主窗口.resizable(width=False, height=False)  # 禁止调整窗口大小
主窗口.title("计算器")  # 设置窗口标题

# 创建菜单栏
主菜单 = Menu()
计算器菜单 = Menu(主菜单, tearoff=0)  # 创建子菜单，禁用分离功能
计算器菜单.add_command(label='退出', command=lambda: exit())  # 添加退出选项
主菜单.add_cascade(label='菜单', menu=计算器菜单)  # 将子菜单添加到主菜单

# 创建变量
显示文本 = StringVar()  # 用于显示计算结果
分隔符标志 = IntVar()  # 控制是否使用千位分隔符
分隔符标志.set(0)  # 默认不使用分隔符

主窗口['menu'] = 主菜单  # 设置窗口的菜单栏

# 创建显示框
显示框 = Entry(主窗口, textvariable=显示文本)
显示框.pack(expand=YES, fill=BOTH, padx=2, pady=4)

# 创建第一行按钮（回退和清空）
第一行 = 创建框架(主窗口)
创建按钮(第一行, '回退', lambda t=显示文本: t.set(退格(t.get())))
创建按钮(第一行, '清空', lambda t=显示文本: t.set(''))

# 创建数字和运算符按钮
按键布局 = ('789/', '456*', '123-', '0.=+')
 for 按键组 in 按键布局:
    按钮行 = 创建框架(主窗口)
    for 按键 in 按键组:
        if 按键 == '=':
            创建按钮(按钮行, 按键, lambda d=显示文本: d.set(计算结果(d.get())))
        else:
            创建按钮(按钮行, 按键, lambda d=显示文本, k=按键: d.set(d.get() + k))

if __name__ == '__main__':
    主窗口.mainloop()  # 启动主循环
